package br.com.rglariguet.pioneer.util;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import br.com.rglariguet.pioneer.dao.AutorizadaDAO;
import br.com.rglariguet.pioneer.dao.DadosBasicosProdutoDAO;
import br.com.rglariguet.pioneer.dao.DadosPerfilDAO;
import br.com.rglariguet.pioneer.dao.DefeitoPioneerDAO;
import br.com.rglariguet.pioneer.dao.EnderecoDAO;
import br.com.rglariguet.pioneer.dao.ManualDAO;
import br.com.rglariguet.pioneer.dao.PecaDAO;
import br.com.rglariguet.pioneer.dao.PerfilDAO;
import br.com.rglariguet.pioneer.dao.UsuarioDAO;
import br.com.rglariguet.pioneer.enums.TipoUsuarioEnum;
import br.com.rglariguet.pioneer.modelos.Autorizada;
import br.com.rglariguet.pioneer.modelos.DadosBasicosProduto;
import br.com.rglariguet.pioneer.modelos.DadosPerfil;
import br.com.rglariguet.pioneer.modelos.DefeitoPioneer;
import br.com.rglariguet.pioneer.modelos.Endereco;
import br.com.rglariguet.pioneer.modelos.Manual;
import br.com.rglariguet.pioneer.modelos.Peca;
import br.com.rglariguet.pioneer.modelos.Perfil;
import br.com.rglariguet.pioneer.modelos.Usuario;

public class PioneerMock {

	public static void populaAparelhos(DadosBasicosProdutoDAO aparelhoDao) {
		List<DadosBasicosProduto> criaAparelhosMock = PioneerMock.criaAparelhosMock(5);
		for (DadosBasicosProduto aparelho : criaAparelhosMock) {
			aparelhoDao.salvar(aparelho);
		}
	}

	public static void populaPecas(PecaDAO pecaDao) {
		List<Peca> pecas = PioneerMock.criaPecasMock(5);
		for (Peca peca : pecas) {
			pecaDao.salvar(peca);
		}
	}

	public static void populaDefeitosPioneer(DefeitoPioneerDAO defeitoPioneerDao) {
		List<DefeitoPioneer> defeitosPioneer = PioneerMock.criaDefeitosPioneerMock(5);
		for (DefeitoPioneer defeito : defeitosPioneer) {
			defeitoPioneerDao.salvar(defeito);
		}
	}

	public static void populaAutorizada(AutorizadaDAO autorizadaDao, DadosPerfilDAO dadosPerfilDao, EnderecoDAO enderecoDao, UsuarioDAO usuarioDao,
			PerfilDAO perfilDao) {
		for (Autorizada autorizada : criaAutorizadas(10, perfilDao)) {
			enderecoDao.salvar(autorizada.getDadosPerfil().getEndereco());
			dadosPerfilDao.salvar(autorizada.getDadosPerfil());
			usuarioDao.salvar(autorizada.getUsuario());
			autorizadaDao.salvar(autorizada);
		}
	}

	public static List<Autorizada> criaAutorizadas(int quantidade, PerfilDAO perfilDao) {
		List<Autorizada> autorizadas = new ArrayList<Autorizada>();

		for (int i = 1; i <= quantidade; i++) {
			Autorizada autorizada = new Autorizada();
			DadosPerfil dadosPerfil = new DadosPerfil();
			dadosPerfil.setEmpresa("EMPRESA " + i);
			dadosPerfil.setCentro("CENTRO " + i);
			dadosPerfil.setOrganizacaoDeVendas("ORG VENDAS " + i);
			dadosPerfil.setCanalDeDistribuicao("CANAL DISTR " + i);
			dadosPerfil.setSetorDeAtividade("SETOR ATIV " + i);
			dadosPerfil.setEscritorioDeVendas("ESCR VENDAS " + i);
			dadosPerfil.setCentroDeTrabalho("CENTRO TRAB " + i);
			dadosPerfil.setDivisao("DIVISAO " + i);
			dadosPerfil.setCentroDeCusto("CENTRO CUSTO " + i);
			dadosPerfil.setGrupoDePlanejamento("GRUPO PLANEJ " + i);
			dadosPerfil.setGrupoDeProduto("GRUPO PROD " + i);
			dadosPerfil.setLocalizacao("LOCALIZ " + i);
			dadosPerfil.setTipoDeNota("TIPO NOTA " + i);
			dadosPerfil.setTipoOrdemServico("TIPO OS " + i);
			dadosPerfil.setTipoOrdemVendaIW("IW " + i);
			dadosPerfil.setTipoOrdemVendaOW("OW " + i);
			dadosPerfil.setTipoOrdemCompra("Ordem Compra " + i);
			dadosPerfil.setOrganizacaoDeCompra("ORG COMPRA " + i);
			dadosPerfil.setGrupoDeCompra("Grupo de Compra " + i);
			dadosPerfil.setEmail("EMAIL " + i);
			dadosPerfil.setTelefone("TEL " + i);
			dadosPerfil.setCelular("CEL " + i);
			dadosPerfil.setCodigoSap("CODIGO SAP " + i);
			Endereco end = new Endereco();
			end.setRua("RUA " + i);
			end.setNumero("NRO " + i);
			end.setComplemento("COMPL " + i);
			end.setCidade("CIDADE " + i);
			end.setEstado("ESTADO " + i);
			end.setCep("CEP " + i);
			dadosPerfil.setEndereco(end);
			autorizada.setDadosPerfil(dadosPerfil);

			if (i % 2 == 0) {
				autorizada.setNomeAutorizada("ASSISTENCIA " + i);

				Usuario usuario = criaUsuario(perfilDao, autorizada.getNomeAutorizada(),
						autorizada.getNomeAutorizada().toLowerCase().replaceAll("[aeiou]\\B", "").replaceAll(" ", ""), "asc", TipoUsuarioEnum.ASC, false);
				autorizada.setUsuario(usuario);
			} else {
				autorizada.setNomeAutorizada("CONCESSIONARIA " + i);

				Usuario usuario = criaUsuario(perfilDao, autorizada.getNomeAutorizada(),
						autorizada.getNomeAutorizada().toLowerCase().replaceAll("[aeiou]\\B", "").replaceAll(" ", ""), "oem", TipoUsuarioEnum.OEM, false);
				autorizada.setUsuario(usuario);
				
			}
			autorizadas.add(autorizada);
		}

		return autorizadas;
	}

	public static List<DefeitoPioneer> criaDefeitosPioneerMock(int quantidade) {
		List<DefeitoPioneer> defeitos = new ArrayList<DefeitoPioneer>();

		for (int i = 1; i <= quantidade; i++) {
			DefeitoPioneer defeito = new DefeitoPioneer();
			defeito.setCodigoGrupo("COD GRUPO " + i);
			defeito.setCodigoPais("COD PAIS " + i);
			defeito.setCodigoFuncao("COD FUNCAO " + i);
			defeito.setCodigoSintoma("COD SINTOMA " + i);
			defeito.setCodigoPioneer("COD PIONEER " + i);
			defeito.setDefeito("DEFEITO " + i);
			defeito.setDescricao("DESC " + i);
			defeito.setSintoma("SINTOMA " + i);
			defeito.setFuncao("FUNCAO " + i);
			defeito.setSolucao("SOLUCAO " + i);

			defeitos.add(defeito);
		}

		return defeitos;
	}

	public static List<DadosBasicosProduto> criaAparelhosMock(int quantidade) {
		List<DadosBasicosProduto> aparelhos = new ArrayList<DadosBasicosProduto>();

		for (int i = 0; i < quantidade; i++) {
			DadosBasicosProduto aparelho = new DadosBasicosProduto();
			aparelho.setCodigoConcessionaria("Cod Concessionaria " + i);
			aparelho.setCodigoPioneer("Cod Pioneer " + i);
			aparelho.setCodigoCentro("Cod Centro " + i);
			aparelho.setNotaFiscalRelevante(true);
			aparelho.setGrupoReembolso("Grupo Reembolso " + i);
			aparelho.setEscritorioVenda("Escritorio Venda " + i);
			aparelho.setModelo("Modelo aparelho " + i);
			aparelhos.add(aparelho);
		}

		DadosBasicosProduto aparelho = new DadosBasicosProduto();
		aparelho.setCodigoConcessionaria("TESTE");
		aparelho.setCodigoPioneer("TESTE");
		aparelho.setCodigoCentro("TESTE");
		aparelho.setNotaFiscalRelevante(true);
		aparelho.setGrupoReembolso("TESTE");
		aparelho.setEscritorioVenda("TESTE");
		aparelho.setModelo("AVH-3580DVD"); // 4600000006
		aparelhos.add(aparelho);

		DadosBasicosProduto aparelho2 = new DadosBasicosProduto();
		aparelho2.setCodigoConcessionaria("TESTE");
		aparelho2.setCodigoPioneer("TESTE");
		aparelho2.setCodigoCentro("TESTE");
		aparelho2.setNotaFiscalRelevante(true);
		aparelho2.setGrupoReembolso("TESTE");
		aparelho2.setEscritorioVenda("TESTE");
		aparelho2.setModelo("DEH-M1507ZC"); // 1234567890CC
		aparelhos.add(aparelho2);

		return aparelhos;
	}

	public static void populaManuais(ManualDAO manualDao) {
		for (Manual manual : criaManuais()) {
			manualDao.salvar(manual);
		}
	}

	public static List<Manual> criaManuais() {
		List<Manual> manuais = new ArrayList<Manual>();
		for (int i = 1; i < 4; i++) {
			Manual m = new Manual();
			m.setNome("Manual do Produto " + i);
			m.setNomeArquivo("manualx" + i);
			manuais.add(m);
		}
		return manuais;
	}

	public static List<Peca> criaPecasMock(int quantidade) {
		List<Peca> pecas = new ArrayList<Peca>();
		for (int i = 0; i < quantidade; i++) {
			Peca peca = new Peca();
			peca.setCodigo("PECA " + i);
			peca.setDescricao("DESC PECA " + i);
			peca.setDisponibilidade("DISP" + i);
			peca.setPreco(BigDecimal.valueOf(10.14));
			pecas.add(peca);
		}
		return pecas;
	}

	public static void criarUsuarios(UsuarioDAO usuarioDAO, PerfilDAO perfilDAO) {
		salvaUsuario(usuarioDAO, perfilDAO, "Usuario OEM Teste", "oem", "oem", TipoUsuarioEnum.OEM, true);
		salvaUsuario(usuarioDAO, perfilDAO, "Usuario ASC Teste", "asc", "asc", TipoUsuarioEnum.ASC, true);
		salvaUsuario(usuarioDAO, perfilDAO, "Usuario ADMIN Teste", "admin", "admin", TipoUsuarioEnum.ADMIN, true);
	}

	public static void salvaUsuario(UsuarioDAO usuarioDAO, PerfilDAO perfilDAO, String nome, String login, String senha, TipoUsuarioEnum tipo, boolean usuarioAtivo) {
		Usuario usuario = criaUsuario(perfilDAO, nome, login, senha, tipo, usuarioAtivo);

		usuarioDAO.salvar(usuario);
	}

	private static Usuario criaUsuario(PerfilDAO perfilDAO, String nome, String login, String senha, TipoUsuarioEnum tipo, boolean usuarioAtivo) {
		Perfil perfil = perfilDAO.buscaPorNome(tipo.getRole());
		List<Perfil> perfis = new ArrayList<Perfil>();
		perfis.add(perfil);
		Usuario usuario = new Usuario();
		usuario.setNome(nome);
		usuario.setLogin(login);
		usuario.setSenha(senha);
		usuario.setPerfis(perfis);
		usuario.setTipoUsuario(tipo);
		usuario.setUsuarioAtivo(usuarioAtivo);
		return usuario;
	}

	public static boolean consultarGarantia(String modelo, String numeroDeSerie) {
		if (modelo.equals("Modelo aparelho 0")) {
			return true;
		}
		return false;
	}

	public static void criaPerfis(PerfilDAO perfilDAO) {
		Perfil perfilOem = new Perfil();
		perfilOem.setNome("ROLE_OEM");
		perfilDAO.salvar(perfilOem);
		
		Perfil perfilAsc = new Perfil();
		perfilAsc.setNome("ROLE_ASC");
		perfilDAO.salvar(perfilAsc);
		
		Perfil perfilAdmin = new Perfil();
		perfilAdmin.setNome("ROLE_ADM");
		perfilDAO.salvar(perfilAdmin);
	}

}
